package algoritmos;

import java.util.ArrayList;
import java.util.List;

import mapeamento.MapeamentoAbsoluto;
import mapeamento.MapeamentoRelativo;

import parsedquery.Conceito;

public class HandleSelectionPredicates {
	
	public static List<String> execute(List<Conceito> query, List<MapeamentoAbsoluto> mapAbsoluto, List<MapeamentoRelativo> mapRelativo) {
		List<String> where = new ArrayList<String>();
		
		for (int i = 0; i < query.size(); i++) {
			Conceito con = query.get(i);
			if (con.getPredicados() != null) {
				for (int j = 0; j < con.getPredicados().size(); j++) {
					String[] parsedQuery = con.getPredicados().get(j).split("=");
	
					List<Conceito> subquery = getSubquery(query, con.getConceito(), parsedQuery[0]);
	
					String xQueryLeft = DecomposeQuery.execute(subquery, mapAbsoluto, mapRelativo, String.valueOf(con.getOid()), con.getConceito());
					String predicado = "(" + xQueryLeft + ") = (" + parsedQuery[1] + ")";
					where.add(predicado);				
				}
			}
		}

		return where;
	}
	
	private static List<Conceito> getSubquery(List<Conceito> query, String conceito, String expressao) {
		List<Conceito> subquery = new ArrayList<Conceito>();
		
		for (int i = 0; i < query.size(); i++) {
			Conceito con = query.get(i);
			
			if (con.getConceito().equals(conceito)) {
				
				Conceito newCon1 = new Conceito(con.getOid(), con.getConceito(), con.getLcm());
				newCon1.setFontes(con.getFontes());
				subquery.add(newCon1);
				
				Conceito newCon2 = new Conceito(con.getOid()+"-"+"1", expressao, con.getLcm());
				newCon2.setFontes(con.getFontes());
				subquery.add(newCon2);
			}			
		}
		
		return subquery;
	}

}
